package com.springInit;

import com.mvc.service.GoodsServiceImpl;
import com.mvc.util.TransactionUtil;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @ Author xsd
 * @ crate time 2020/6/4 14:03
 * @ 描述 需要包 asm,cglib
 */
public class CglibProxy implements MethodInterceptor {
    private Object target;//需要代理的目标对象

    //重写拦截方法
    @Override
    public Object intercept(Object obj, Method method, Object[] arr, MethodProxy proxy) throws Throwable {
        Object invoke=null;
        try{
            TransactionUtil.beginTransaction();
            invoke = method.invoke(target, arr);
            //方法执行，参数：target 目标对象 arr参数数组
            TransactionUtil.commit();
        }catch (Exception e){
            TransactionUtil.rollback();
            throw e;
        }
        return invoke;
    }

    //定义获取代理对象方法
    public Object getCglibProxy(Object objectTarget){
        //为目标对象target赋值
        this.target = objectTarget;
        Enhancer enhancer = new Enhancer();
        //设置父类,因为Cglib是针对指定的类生成一个子类，所以需要指定父类
        enhancer.setSuperclass(objectTarget.getClass());
        enhancer.setCallback(this);// 设置回调
        Object result = enhancer.create();//创建并返回代理对象
        return result;
    }

    public static void main(String[] args) {
        // CGLIB是针对类实现代理，主要是对指定的类生成一个子类，覆盖其中的方法
        CglibProxy cglib = new CglibProxy();//实例化CglibProxy对象
        GoodsServiceImpl f =  (GoodsServiceImpl) cglib.getCglibProxy(new GoodsServiceImpl());//获取代理对象
        f.findGoodsList();
    }
}
